from fastapi import FastAPI, HTTPException
from fastapi.staticfiles import StaticFiles
from fastapi.responses import HTMLResponse
from typing import List
import time
import logging
import os

from docker_auto.mirrors.detector import MirrorDetector
from docker_auto.mirrors.models import MirrorTestResult, TestResults

# 配置日志
logger = logging.getLogger(__name__)

# 创建FastAPI应用实例
app = FastAPI(
    title="Docker镜像加速器检测工具",
    description="用于检测Docker镜像加速器有效性的工具，通过Web界面展示检测结果",
    version="1.0.0"
)

# 初始化镜像检测器
detector = MirrorDetector()

# 存储测试结果的历史记录
test_history: List[TestResults] = []

# 挂载静态文件目录
static_dir = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "web", "static")
if os.path.exists(static_dir):
    app.mount("/static", StaticFiles(directory=static_dir), name="static")

@app.get("/")
async def root():
    """
    根路径，返回API基本信息或前端页面
    """
    # 如果存在静态文件，返回前端页面
    if os.path.exists(os.path.join(static_dir, "index.html")):
        return HTMLResponse(content=open(os.path.join(static_dir, "index.html"), "r", encoding="utf-8").read())
    
    return {
        "message": "Docker镜像加速器检测工具API", 
        "docs": "/docs", 
        "redoc": "/redoc"
    }

@app.get("/mirrors", response_model=List[str])
async def list_mirrors():
    """
    获取默认检测的镜像加速器列表
    """
    return detector.mirrors

@app.get("/test", response_model=TestResults, tags=["测试"])
async def test_mirrors():
    """
    执行镜像加速器测试并返回结果
    """
    logger.info("开始测试所有镜像加速器")
    
    try:
        # 执行测试
        results_data = detector.test_all_mirrors()
        
        # 封装结果
        test_result = TestResults(
            timestamp=time.time(),
            results=[MirrorTestResult(**result) for result in results_data]
        )
        
        # 添加到历史记录
        test_history.append(test_result)
        
        logger.info(f"测试完成，共检测 {len(results_data)} 个镜像加速器")
        return test_result
        
    except Exception as e:
        logger.error(f"测试过程中发生错误: {e}")
        raise HTTPException(status_code=500, detail=f"测试过程中发生错误: {str(e)}")

@app.get("/test/{mirror_url}", response_model=MirrorTestResult, tags=["测试"])
async def test_single_mirror(mirror_url: str):
    """
    测试单个镜像加速器
    
    Args:
        mirror_url: 镜像加速器URL
    """
    logger.info(f"开始测试镜像加速器: {mirror_url}")
    
    try:
        # 执行单个测试
        result_data = detector.test_mirror(mirror_url)
        result = MirrorTestResult(**result_data)
        
        logger.info(f"镜像加速器 {mirror_url} 测试完成")
        return result
        
    except Exception as e:
        logger.error(f"测试镜像加速器 {mirror_url} 时发生错误: {e}")
        raise HTTPException(status_code=500, detail=f"测试过程中发生错误: {str(e)}")

@app.get("/history", response_model=List[TestResults], tags=["历史记录"])
async def get_test_history():
    """
    获取测试历史记录
    """
    return test_history

@app.delete("/history", tags=["历史记录"])
async def clear_test_history():
    """
    清空测试历史记录
    """
    test_history.clear()
    return {"message": "历史记录已清空"}